#include "RepresentadorEnBits.h"
#include <stdio.h>
#include <string.h>
using namespace std;
#include <iostream>
#include <math.h>

RepresentadorEnBits::RepresentadorEnBits() {
	this->numeros = 0;
	this->pos_actual = 0;
}

RepresentadorEnBits::~RepresentadorEnBits() {
	delete[] this->numeros;
}

void RepresentadorEnBits::set_long(int longitud) {
	this->longitud = longitud;
	this->numeros = new int[longitud];
	memset(this->numeros,0,longitud);
}
void RepresentadorEnBits::agregar_cero() {
	this->numeros[pos_actual] = 0;
	this->pos_actual++;
}
void RepresentadorEnBits::agregar_uno(){
	this->numeros[pos_actual] = 1;
	this->pos_actual++;
}
void RepresentadorEnBits::agregar_nro_dec(int long_usada, int numero) {
	if (long_usada > 0) {
		int cantidad_agregada = 0;
		if ( numero < 2) {
			if (numero == 1) {
				this->agregar_uno();
			}
			else {
				this->agregar_cero();
			}
			cantidad_agregada++;
		}
		else {
			int resultado = 0;
			int resto = 0;
			bool salida = false;
			while (!salida) {
				resultado = numero / 2 ;
				resto = numero % 2;
				if ( resto == 1 ) {
					this->agregar_uno();
				}
				else {
					this->agregar_cero();
				}
				cantidad_agregada++;
				if ( resultado < 2) {
					if (resultado == 1) {
						this->agregar_uno();
					}
					else {
						this->agregar_cero();
					}
					cantidad_agregada++;
					salida = true;
				}
				numero = resultado;
			}
		}
		if (cantidad_agregada < long_usada) {
			while ( cantidad_agregada < long_usada) {
				this->agregar_cero();
				cantidad_agregada++;
			}
		}
	}
}

void RepresentadorEnBits::pasar_a_bit(std::string* cadena) {

	int i = this->longitud -1;
	while ( i >= 0) {
		if (this->numeros[i] == 1) {
			cadena->push_back('1');
		}
		else {
			cadena->push_back('0');
		}
		i--;
	}
}

int RepresentadorEnBits::getLongitud() {
	return this->longitud;
}

int RepresentadorEnBits::devolver_entero() {
	int aux = 0;
	int longi = this->longitud -1 ;
	int contador = 0;
	while ( longi >= 0 ) {
		int pot = pow(2, aux);
		int a = this->numeros[longi];
		pot = pot * a;
		contador = contador +  pot;
		longi--;
		aux++;
	}
	return contador;
}
